package org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.core;

import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;

/**
 * 
 * @author Peter Evans
 *
 */
public class Utils {
	
	public enum Situacion {
		ATAQUE, DEFENSA
	}
	
	public final static double RADIO_DESMARQUE = 30.0;
	
	/**
	 * 
	 * @param pos
	 * @return
	 */
	public static double distanciaNormalizadaAPorteria(Posicion pos) {
		return pos.distancia(Constantes.centroArcoSup) / (Constantes.LARGO_CAMPO + 10);
	}
	/** 
	 * 
	 * @param i
	 * @param sp
	 * @param pos
	 * @return
	 */
	public static double probabilidadDesmarque(SituacionPartido sp, Posicion pos) {
		double probabilidadAcumulada = 0;
		int nmolesta = 0;
		int[] indices = pos.indicesMasCercanos(sp.rivales());
		for(int k : indices) {
			double d = pos.distancia(sp.rivales()[k]);
			if(d < RADIO_DESMARQUE) {
				d = d / (double)RADIO_DESMARQUE;
				// molesta
				if(probabilidadAcumulada == 0) {
					probabilidadAcumulada = d;
				} else {
					probabilidadAcumulada *= d;
				}
				nmolesta++;
			}
		}
		if(nmolesta == 0) {
			return 1;
		}
		return probabilidadAcumulada;
	}
	
	public final static double RADIO_INTERCEPCION = 30.0;
	
	/**
	 * @param interceptores
	 * @param porigen
	 * @param pfinal
	 * @return
	 */
	public static double probabilidadIntercepcion(Posicion[] interceptores, Posicion porigen, Posicion pfinal) {
		double a = (pfinal.getY() - porigen.getY()) / 
			(pfinal.getX() - porigen.getX()); 
		double b = pfinal.getY() - a*pfinal.getX();
		boolean ySign = pfinal.getY() > porigen.getY();
		boolean xSign = pfinal.getX() > porigen.getX();
		double probabilidadAcumulada = 0;
		int nInterceptores = 0;
		for(Posicion p: interceptores) {
			Posicion objective = null;
			// Si x crecer� y este jugador est� enmedio
			if(xSign && p.getX() > porigen.getX() && p.getX() < pfinal.getX()) {
				objective = new Posicion(p.getX(), p.getX()*a + b);
			} else if(!xSign && p.getX() < porigen.getX() && p.getX() > pfinal.getX()) {
				objective = new Posicion(p.getX(), p.getX()*a + b);    				
			} else if(ySign && p.getY() > porigen.getY() && p.getY() < pfinal.getY()) {
				objective = new Posicion((p.getY() - b) / a, p.getY());
			} else if(!ySign && p.getY() < porigen.getY() && p.getY() > pfinal.getY()) {
				objective = new Posicion((p.getY() - b) / a, p.getY());
			}
			if(objective != null) {
				double d = objective.distancia(p) / RADIO_INTERCEPCION;
				if(d > 1.0) {
					continue;
				}
				if(probabilidadAcumulada == 0) {
					probabilidadAcumulada = d;
				} else {
					probabilidadAcumulada *= d;
				}
				nInterceptores++;
			}
		}
		if(nInterceptores == 0) {
			return 0;
		}
		return 1 - probabilidadAcumulada;
	}
	
	public static boolean dentro(Posicion pos) {
		return(Math.abs(pos.getX()) < ((Constantes.ANCHO_CAMPO/(double)2)-5)  && 
			   Math.abs(pos.getY()) < ((Constantes.LARGO_CAMPO/(double)2)-5)  &&
			   Math.abs(pos.getX()) > ((-Constantes.ANCHO_CAMPO/(double)2)+5) &&
			   Math.abs(pos.getY()) > ((-Constantes.LARGO_CAMPO/(double)2)+5));
	}
}
